package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanCurriculoConhecimentos;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanCurriculoCurso;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalCurriculo;
import br.edu.universo.si.projeto2.infojob.client.componentes.DateBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.comboboxes.NacionalidadeListBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.comboboxes.TitularidadesListBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;

public class ADetalhesProfissionalCurriculo extends DialogBox {
	
	private FlexTable flexTable;
	
	private NacionalidadeListBox nacionalidades;	
	private TextArea descricaoPessoal;	
	private TitularidadesListBox titularidades;
	
	private RadioButton disponibilidadeSim;
	private RadioButton disponibiliddeNao;
	
	private DateBox ultimaAtualizacao;
	private DateBox dataCriacao;
	
	private TextArea comentario;
	
	private static FlexTable gridCurso;
	
	private FlowPanel gridConhecimento;
	
	private FlexTable painelBotaoCadastro;
	
	private static List<BeanCurriculoCurso> lstCurriculoCurso = new ArrayList<BeanCurriculoCurso>();
	private List<BeanCurriculoConhecimentos> lstCurriculoConhecimento = new ArrayList<BeanCurriculoConhecimentos>();
	private Button cancelarBtn;
	
	final private Label nacionalidadelbl = new Label("Nacionalidade");
	final private Label descricaopessoallbl = new Label("Descricao Pessoal");
	final private Label titularidadelbl = new Label("Titularidade");
	final private Label disponibilidadelbl = new Label("Disponibilidade");
	final private Label datatualizacaolbl = new Label("Dt.Ult.Atualizacao");
	final private Label datacriacaolbl = new Label("Data de Criacao");
	final private Label comentariolbl = new Label("Comentario");
	final private Label tituloGridCurso = new Label("Lista de Cursos");
	
	private Integer row = 3;
	private VerticalPanel painelGeral;
	
	private int contConhecimento = 0;

	public ADetalhesProfissionalCurriculo(
			BeanProfissionalCurriculo beanProfissionalCurriculo) {
		super();
		this.setText("Visualizar de dados do Curriculo");
		VerticalPanel vp = new VerticalPanel();
		
		iniciarComponentes(false);
		setarTamanhoCampos();
		int idnac = beanProfissionalCurriculo.getBNacionalidade().getId();
		if(nacionalidades.getCallback()){
			nacionalidades.setSelectedIndex(idnac);
		} else {
			nacionalidades.setIndice(idnac);
			nacionalidades.atualiza();
		}
		descricaoPessoal.setText(beanProfissionalCurriculo.getDescricaoPessoal());		
		int idtitular = beanProfissionalCurriculo.getBTitularidade().getId();
		if(titularidades.getCallback()){
		  titularidades.setSelectedIndex(idtitular);	
		} else {
			titularidades.setIndice(idtitular);
			titularidades.atualiza();
		}
		
		if (beanProfissionalCurriculo.isDisponibilidadeViagem() == true) {
			disponibilidadeSim.setChecked(beanProfissionalCurriculo
					.isDisponibilidadeViagem());
		} else {
			disponibiliddeNao.setChecked(!beanProfissionalCurriculo
					.isDisponibilidadeViagem());
		}
		dataCriacao.setText(beanProfissionalCurriculo.getDataCriacao());
		ultimaAtualizacao.setText(beanProfissionalCurriculo
				.getUltimaAtualizacao());
		comentario.setText(beanProfissionalCurriculo.getComentario());
		this.setAnimationEnabled(true);
		this.center();
		this.setWidth("600px");
		this.setHeight("400px");
		HorizontalPanel panelDisponibilidade = new HorizontalPanel();
		panelDisponibilidade.add(disponibilidadeSim);
		panelDisponibilidade.add(disponibiliddeNao);

		cancelarBtn = new Button("Fechar");
		disponibilidadeSim.setText("Sim");
		disponibiliddeNao.setText("Nao");
		flexTable = new FlexTable();
		FlexCellFormatter cellFormatter = flexTable.getFlexCellFormatter();
		flexTable.setCellSpacing(6);
		flexTable.setWidget(0, 0, nacionalidadelbl);
		flexTable.setWidget(0, 1, nacionalidades);
		
		flexTable.setWidget(1, 0, disponibilidadelbl);
		flexTable.setWidget(1, 1, panelDisponibilidade);
		
		flexTable.setWidget(2, 0, titularidadelbl);
		flexTable.setWidget(2, 1, titularidades);
		
		flexTable.setWidget(3, 0, datacriacaolbl);
		flexTable.setWidget(3, 1, dataCriacao);
		
		flexTable.setWidget(4, 0, datatualizacaolbl);
		flexTable.setWidget(4, 1, ultimaAtualizacao);
		
		flexTable.setWidget(5, 0, descricaopessoallbl);
		flexTable.setWidget(5, 1, descricaoPessoal);
		
		flexTable.setWidget(6, 0, comentariolbl);
		flexTable.setWidget(6, 1, comentario);

		setarEstiloGridCurso();
		tituloGridCurso.setHeight("15px");
		DisclosurePanel discCursos = new DisclosurePanel(tituloGridCurso
				.getText(), true);
        gridCurso.clear();
		gridCurso.setCellPadding(7);
		gridCurso.setCellSpacing(1);
		gridCurso.setWidth("300px");

		gridCurso.setWidget(0, 0, new HTML("ID"));
		gridCurso.setWidget(0, 1, new HTML("Curso"));
		gridCurso.setWidget(0, 2, new HTML("Carga Horaria"));
		gridCurso.setWidget(0, 3, new HTML("Instituicao"));
		gridCurso.getFlexCellFormatter().setVisible(0, 0, false);
		//gridConhecimento.setSize("100px", "20px");
		AsyncCallback<HashMap<Integer, String>> clCurConhecimento = new AsyncCallback<HashMap<Integer, String>>() {
			public void onSuccess(HashMap<Integer, String> result) {
				for (int i = 1; i < result.size(); i++) {
					CheckBox ck = new CheckBox(result.get(i));
					ck.setEnabled(false);
					gridConhecimento.add(ck);
				}
				contConhecimento = result.size();
			}

			public void onFailure(Throwable caught) {

				ErrorDialogBox erroConhecimento = new ErrorDialogBox(
						"Erro ao buscar conhecimento" + caught.getMessage());
				erroConhecimento.show();
			}
		};
		Util.getService().getConhecimentos(clCurConhecimento);
		AsyncCallback<List<BeanCurriculoConhecimentos>> callbackcurconhecimento = new AsyncCallback<List<BeanCurriculoConhecimentos>>() {
			public void onSuccess(List<BeanCurriculoConhecimentos> result) {
				if (result.size() > 0) {
					atualizarGridConhecimento(result);
				}
			}

			public void onFailure(Throwable caught) {
				ErrorDialogBox errocur = new ErrorDialogBox(
						"Erro ao buscar curriculo conhecimento"
								+ caught.getMessage());
				errocur.center();
				errocur.show();
			}
		};
		Util.getService().getCurriculoConhecimentos(
				beanProfissionalCurriculo.getId(), callbackcurconhecimento);

		// somente chamo o callback caso seja uma alteracao
		
		carregargrid(beanProfissionalCurriculo);
		vp.add(gridCurso);
		discCursos.add(vp);
		cellFormatter.setAlignment(8, 0, HasHorizontalAlignment.ALIGN_CENTER,
				HasVerticalAlignment.ALIGN_MIDDLE);

		painelBotaoCadastro.setWidget(0, 1, cancelarBtn);
		// acao para fechar...
		cancelarBtn.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				ADetalhesProfissionalCurriculo.this.hide();
			}
		});

		painelGeral.add(flexTable);
		painelGeral.add(gridConhecimento);
		painelGeral.add(discCursos);
		painelGeral.add(painelBotaoCadastro);
		painelGeral.setWidth("600px");
		painelGeral.setHeight("400px");
		this.center();
		this.add(painelGeral);

	}

	private void setarTamanhoCampos() {
		nacionalidades.setWidth("300px");
		titularidades.setWidth("300px"); 
		ultimaAtualizacao.setWidth("100px");
		dataCriacao.setWidth("100px");

		
	}

	public void iniciarComponentes(boolean habilita) {

		nacionalidades = new NacionalidadeListBox();
		nacionalidades.setEnabled(habilita);
		descricaoPessoal = new TextArea();
		descricaoPessoal.setEnabled(habilita);
		titularidades = new TitularidadesListBox();
		titularidades.setEnabled(habilita);
		disponibilidadeSim = new RadioButton("Sim");
		disponibilidadeSim.setEnabled(habilita);
		disponibiliddeNao = new RadioButton("Nao");
		disponibiliddeNao.setEnabled(habilita);
		ultimaAtualizacao = new DateBox();
		ultimaAtualizacao.setEnabled(habilita);
		dataCriacao = new DateBox();
		dataCriacao.setEnabled(habilita);
		comentario = new TextArea();
		comentario.setEnabled(habilita);
		gridCurso = new FlexTable();
		gridConhecimento = new FlowPanel();
		painelBotaoCadastro = new FlexTable();

		painelGeral = new VerticalPanel();

	}

	public void setarEstiloGridCurso() {

		gridCurso.getFlexCellFormatter().setStyleName(0, 0,
				"resultadoGridCamposDialog");
		gridCurso.getFlexCellFormatter().setStyleName(0, 1,
				"resultadoGridCamposDialog");
		gridCurso.getFlexCellFormatter().setStyleName(0, 2,
				"resultadoGridCamposDialog");
		gridCurso.getFlexCellFormatter().setStyleName(0, 3,
				"resultadoGridCamposDialog");

		gridCurso.setStyleName("resultadoGridDialog");

	}

	private void addContagem(int totalResultado) {

		gridCurso.setWidget(totalResultado + 1, 0, new HTML(
				"Total de cursos encontrados: " + totalResultado));
		gridCurso.getFlexCellFormatter().setColSpan(totalResultado + 1, 0, 3);
		gridCurso.getFlexCellFormatter().setAlignment(totalResultado + 1, 0,
				HasHorizontalAlignment.ALIGN_RIGHT,
				HasVerticalAlignment.ALIGN_MIDDLE);
		gridCurso.getFlexCellFormatter().setStyleName(totalResultado + 1, 0,
				"resultadoGridContagem");

	}


	public void setRow(Integer row) {

		this.row = row;
	}

	public Integer getRow() {

		return row;
	}

	public void setLstCurriculoconhecimento(
			List<BeanCurriculoConhecimentos> lstCurriculoconhecimento) {

		this.lstCurriculoConhecimento = lstCurriculoconhecimento;
	}

	public List<BeanCurriculoConhecimentos> getLstCurriculoconhecimento() {

		return lstCurriculoConhecimento;
	}

	public void carregargrid(BeanProfissionalCurriculo bpcurriculo) {
		if (bpcurriculo != null) {
			AsyncCallback<List<BeanCurriculoCurso>> clCurCurso = new AsyncCallback<List<BeanCurriculoCurso>>() {
				int i = 1;
				
				public void onSuccess(List<BeanCurriculoCurso> result) {
					lstCurriculoCurso.clear();
					
					for (Iterator<BeanCurriculoCurso> iterator = result
							.iterator(); iterator.hasNext();) {
						BeanCurriculoCurso beanCurriculoCurso = (BeanCurriculoCurso) iterator
								.next();
						gridCurso.setWidget(i, 0, new HTML(beanCurriculoCurso
								.getId()
								+ ""));
						gridCurso.setWidget(i, 1, new HTML(beanCurriculoCurso
								.getCurso()));
						gridCurso.setWidget(i, 2, new HTML(beanCurriculoCurso
								.getCargaHoraria()
								+ ""));
						gridCurso.setWidget(i, 3, new HTML(beanCurriculoCurso
								.getInstituicao()));
						gridCurso.getFlexCellFormatter()
								.setVisible(i, 0, false);
						lstCurriculoCurso.add(beanCurriculoCurso);
						i++;
					}
					addContagem(lstCurriculoCurso.size());
					setRow(i);
				}

				public void onFailure(Throwable caught) {

					ErrorDialogBox erroBen = new ErrorDialogBox(
							"Erro ao buscar Curriculo Curso" + caught);
					erroBen.show();

				}

			};
			Util.getService().getlistCurriculoCurso(bpcurriculo.getId(),
					clCurCurso);

		}

		addContagem(lstCurriculoCurso.size());
	}
	private void atualizarGridConhecimento(final List<BeanCurriculoConhecimentos> list){
		int j = 0;
		for (int i = 0; i < contConhecimento; i++) {
			if ((i + 1) == list.get(j).getIdConhecimento()) {
				((CheckBox) gridConhecimento.getWidget(i))
						.setChecked(true);
				j++;
				if(j==list.size()){
					break;
				}
			}
		}

	}

}
